/*
 * Autores: Bruna de Barros e Bruno Costa
 * Data: 24/11/2012
 *
 * Uso do LCD Keypad Shield
 * Referência: http://www.dfrobot.com/index.php?route=product/product&product_id=51#.ULFX8IfAeOE
 * Utilizando os botões, posicionar o cursor pelo LCD
 *
 */
 
#include<LiquidCrystal.h>
#define BUTTON_RIGHT  0
#define BUTTON_UP     1
#define BUTTON_DOWN   2
#define BUTTON_LEFT   3
#define BUTTON_SELECT 4
#define BUTTON_NONE   5
#define DELAY         500
#define ESTADO_FULL   255
#define ESTADO_EMPTY  32
 
int ultimoBotao;
int linha, coluna;
int estado;
unsigned long t;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Dados do fabricante
 
void setup() {
  lcd.begin(16, 2); // Número de Colunas e Linhas
  lcd.clear();
   
  linha = 0;
  coluna = -1;
  
  ultimoBotao = BUTTON_NONE;
  resetEstado();
 }
 
void loop() {
  if (millis() - t > DELAY) {
    trocarEstado();
    t = millis();
  }
  
  lcd.setCursor(coluna, linha);
  lcd.write(estado);
  
  int botao = lerBotoes();
  if (botao != ultimoBotao) {
    switch(botao) {
      case BUTTON_SELECT:
        resetEstado();
        lcd.clear();
        linha = 0;
        coluna = 0;
        break;
      case BUTTON_LEFT:
        limparPosicao();
        resetEstado();
        coluna--;
        break;
      case BUTTON_RIGHT:
        limparPosicao();
        resetEstado();
        coluna++;
        break;
      case BUTTON_UP:
        limparPosicao();
        resetEstado();
        linha--;
        break;
      case BUTTON_DOWN:
        limparPosicao();
        resetEstado();
        linha++;
        break;
    }
    ajustarCursor();
    ultimoBotao = botao;
  }
}
 
/**
 * Referência em:
 * http://www.dfrobot.com/wiki/index.php?title=Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)
 *
 */
int lerBotoes() {
  int botao = analogRead(0);
  if (botao > 1000) return BUTTON_NONE;
  if (botao < 50)   return BUTTON_RIGHT;  
  if (botao < 195)  return BUTTON_UP; 
  if (botao < 380)  return BUTTON_DOWN; 
  if (botao < 555)  return BUTTON_LEFT; 
  if (botao < 790)  return BUTTON_SELECT;   
  return BUTTON_NONE;
}
 
void ajustarCursor() {
  if (linha == 0 && coluna < 0) {
    coluna = 0;
    linha = 0;
  }
  else if (linha == 0 && coluna == 16) {
    coluna = 0;
    linha = 1;
  }
  else if (linha == 1 && coluna < 0) {
    coluna = 15;
    linha = 0;
  }
  else if (linha == 1 && coluna == 16) {
    coluna = 15;
    linha = 1;
  }
  else if (linha < 0) {
    linha = 0;
  }
  else if (linha > 1) {
    linha = 1;
  }
}

void trocarEstado() {
  if (estado == ESTADO_FULL) {
    estado = ESTADO_EMPTY;
  }
  else {
    estado = ESTADO_FULL;
  }
}

void limparPosicao() {
  lcd.setCursor(coluna, linha);
  lcd.write(' ');
}

void resetEstado() {
  estado = ESTADO_FULL;
  t = millis();
}
